﻿// 801 移棋子游戏.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <stdio.h>

using  namespace std;
/*
http://oj.daimayuan.top/course/22/problem/903

有个n×m的棋盘，其中(1,1)格在左上角，(n,m)格在右下角。
棋盘的第一行和第一列的每个格子标了黑白两种颜色。

上面有一个棋子。Alice和Bob轮流移动这个棋子，Alice先手移动。
每次可以往上或往左移动一格，一旦这个棋子移动到第一行或者第一列游戏结束。
执行最后一步移动的人，如果将棋子移动到黑格，那么就获胜，否则就失败。

现在给这个棋子的起始位置，问最后获胜的玩家是谁，对于所有(i,j)
满足2≤i≤n,2≤j≤m
输出。

输入格式
第一行两个整数n,m(2≤n,m≤1000)。

接下来一行m−1 
个由BW构成的字符串，分别表示第一行2
到m
格的颜色，其中B是黑色，W是白色。

接下来一行n−1
个由BW构成的字符串，分别表示第一列2
到n
格的颜色，其中B是黑色，W是白色。

输出格式
一共n−1
行，每行m−1
个字母，表示胜者。如果Alice获胜，输出一个A，否则输出一个B。

样例输入
3 4
WBW
BW
样例输出
AAB
BAA
*/

typedef long long ll;

const int N = 2010;
int n, m, dp[N][N];
char r[N], c[N];


int main()
{
	scanf("%d%d",&n,&m);
	scanf("%s",r+2);
	scanf("%s",c+2);
	for (int i = 2; i <= m; i++) {
		dp[1][i] = (r[i] =='W');
		//r[i] = 'W' 1,'B' 0
	}

	for (int i = 2; i <= n; i++) {
		dp[i][1] = (c[i] == 'W');
		//r[i] = 'W' 1,'B' 0
	}

	for (int i = 2; i <= n; i++) {
		for (int j = 2; j <= m; j++) {
			if (dp[i][j - 1] == 0) dp[i][j] = 1;
			if (dp[i - 1][j] == 0) dp[i][j] = 1;
			//dp[i][j] = !(dp[i][j - 1] & dp[i - 1][j]);
			if (dp[i][j] == 1) printf("A");
			else printf("B");
		}
		puts("");
	}


	return 0;

}

 